# 导入HttpResponse类，用于处理HTTP响应
from django.http import HttpResponse
# 导入MiddlewareMixin类，用于创建中间件
from django.utils.deprecation import MiddlewareMixin
# 导入JWT相关的异常类，用于处理JWT验证过程中的各种异常
from jwt import ExpiredSignatureError, InvalidTokenError, PyJWTError
# 导入API设置，通常用于获取JWT相关的配置信息
from rest_framework_jwt.settings import api_settings


class JwtAuthenticationMiddleware(MiddlewareMixin):
    """
    JWT认证中间件
    """

    def process_request(self, request):
        """
        处理请求，进行JWT认证
        :param request: 请求对象
        :return: HttpResponse对象或None
        """
        # 请求白名单
        white_list = ["/app/login", "/app/register"]
        path = request.path
        # 对不在白名单内且不是媒体资源的请求进行token验证
        if path not in white_list and not path.startswith("/media"):
            print("要进行token验证")
            # 从请求头中获取token
            token = request.META.get('HTTP_AUTHORIZATION')
            print("token:", token)
            try:
                # 获取JWT解码处理器
                jwt_decode_handler = api_settings.JWT_DECODE_HANDLER
                # 解码token，进行认证
                jwt_decode_handler(token)
            except ExpiredSignatureError:
                # token过期异常
                return HttpResponse('Token过期，请重新登录！')
            except InvalidTokenError:
                # token无效异常
                return HttpResponse('Token验证失败！')
            except PyJWTError:
                # JWT处理异常
                return HttpResponse('Token验证异常！')
        else:
            # 白名单内的请求或媒体资源，无需token验证
            print("不需要token验证")
            return None
